package Traductor.sintactico.utils;

import Traductor.lexico.utils.Token.TipoToken;
import Traductor.sintactico.utils.TablaOperaciones.Operadores;

/** Clase que modela las operaciones entre operandos.
 */
public class TipoDeOperacion {
	
	private TipoToken tipo1;
	private Operadores op;
	private TipoToken tipo2;
	
	/** Constructora de la clase TipoDeOperacion
	 * @param tipo1 El tipo del primer operando
	 * @param op El tipo de la operacion
	 * @param tipo2 El tipo del segundo operando
	 */
	public TipoDeOperacion(TipoToken tipo1, Operadores op, TipoToken tipo2) {
		this.tipo1 = tipo1;
		this.op = op;
		this.tipo2 = tipo2;
	}
	public TipoToken getTipo1() {
		return tipo1;
	}
	public void setTipo1(TipoToken tipo1) {
		this.tipo1 = tipo1;
	}
	public Operadores getOp() {
		return op;
	}
	public void setOp(Operadores op) {
		this.op = op;
	}
	public TipoToken getTipo2() {
		return tipo2;
	}
	public void setTipo2(TipoToken tipo2) {
		this.tipo2 = tipo2;
	}
	
	/** Devuelve el codigo hash de la operacion guardada en la instancia.
	 * @return El codigo hash en forma de entero.
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((op == null) ? 0 : op.hashCode());
		result = prime * result + ((tipo1 == null) ? 0 : tipo1.hashCode());
		result = prime * result + ((tipo2 == null) ? 0 : tipo2.hashCode());
		return result;
	}
	/** Metodo para comprobar la igualdad entre objetos.
	 * @param obj El objeto a comparar con este.
	 * @return true si es igual, false en otro caso.
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TipoDeOperacion other = (TipoDeOperacion) obj;
		if (op != other.op)
			return false;
		if (tipo1 != other.tipo1)
			return false;
		if (tipo2 != other.tipo2)
			return false;
		return true;
	}	
}
